home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 June
/
EnigmA AMIGA RUN 08 (1996)(G.R. Edizioni)(IT)[!][issue 1996-06][EARSAN CD VII].iso
/
earcd
/
comm2
/
mmmsg140.lha
/
REXX
/
MM_MsgTrack.rexx
Wrap
OS/2 REXX Batch file
|
1996-04-26
|
19KB
|
685 lines
/*
** $VER: MM_MsgTrack 1.40 (12.04.96)
**
** Written by Paolo Carotenuto
**
*/
DROP MM.
MM.PathCfg='MM:Config/'
MM.PrgName='MM_MsgTrack v1.40'
MM.Copyright='(C) 1994-96 Paolo Carotenuto'
MM.LogLevel=2
ADDRESS 'MAILMANAGER'
CALL WriteLog(MM.PrgName 'Started')
CALL ReadConfig()
CALL WriteLog('Found' MM.Mails.Count 'Mail Areas to Check')
DO i=0 FOR MM.Mails.Count
MM.Mail=MM.Mails.i
MM_SearchMsgs MM.Mail Messages '#?' '#?' '#?' IMP !SENT
CALL WriteLog(' Found' Messages.Count 'Messages to Check in Area ['MM.Mail']')
DO t=0 FOR Messages.Count
MM.Message=Messages.t
MM_ReadMsg MM.Mail MM.Message MM.Msg
IF Rc ~=0 THEN ITERATE
CALL Init()
IF CheckEmpty()=TRUE THEN ITERATE
IF CheckBad(MM.FromNode,MM.ToNode,MM.FromName,MM.ToName)=TRUE THEN ITERATE
CALL ReMapName(MM.ToName,MM.ToNode)
CALL ReMap(MM.ToNode)
IF CheckExclude(MM.FromName,MM.FromNode)='TRUE' THEN ITERATE
IF INDEX(MM.Msg.Flags,'INTR') ~=0 THEN;DO
IF MM.FromDomain ~=MM.ToDomain THEN;DO
CALL ProcessaMsg('CROSS_NET')
ITERATE
END
MM_SearchInStem MM.Domain Resp MM.FromDomain STR
IF Resp.Count=0 THEN;DO
CALL ProcessaMsg('UNKNOWN_NET')
ITERATE
END
MM.AddrFrom=CheckAddress(MM.FromNode)
MM.AddrTo=CheckAddress(MM.ToNode)
SELECT
WHEN MM.AddrFrom=FALSE&MM.AddrTo=FALSE THEN;DO
CALL ProcessaMsg('INCREDIBILE')
ITERATE
END
WHEN MM.AddrTo=FALSE THEN CALL ProcessaMsg('BOUNCED')
WHEN MM.AddrFrom=FALSE THEN CALL ProcessaMsg('UNKNOWN_SENDER')
OTHERWISE IF CheckPGP(MM.FromNode)=FALSE THEN CALL LogsDom('Message Okay!')
END
END
ELSE;DO
IF CheckMyAddress(MM.ToNode)=TRUE THEN;DO
CALL LogsDom('Checking for RRR Flag')
IF INDEX(MM.Msg.Flags,'RRR') ~=0 THEN CALL ProcessaMsg('RECEIPT_REQUEST')
END
ELSE CALL LogsDom('Message Okay!')
END
IF MM.WriteLog=TRUE THEN;DO
IF MM.LogFile ~='' THEN;DO
MM_WriteStem MM.LogFile MM.Log 'APPEND'
MM.Log.Count=0
END
DO k=0 FOR MM.LogDomain.Count
PARSE VALUE UPPER(MM.LogDomain.k) WITH Log_Domain Log_File .
IF MM.Log_Domain.Count>0 THEN;DO
MM_WriteStem Log_File MM.Log_Domain 'APPEND'
MM.Log_Domain.Count=0
END
END
END
END
END
CALL WriteLog(MM.PrgName 'Ended')
IF MM.WriteLog=FALSE THEN;DO
IF MM.LogFile ~='' THEN;DO
MM_WriteStem MM.LogFile MM.Log 'APPEND'
END
DO k=0 FOR MM.LogDomain.Count
PARSE VALUE UPPER(MM.LogDomain.k) WITH Log_Domain Log_File .
IF MM.Log_Domain.Count>0 THEN;DO
MM_WriteStem Log_File MM.Log_Domain 'APPEND'
END
END
END
EXIT 0
WriteStatus:PROCEDURE EXPOSE MM.
PARSE ARG NumMsg
IF MM.LogLevels>=1 THEN;DO
CALL LogsDom('.')
CALL LogsDom('Processing Message #'NumMsg '( 'MM.Msg.Flags')')
END
IF MM.LogLevels>=2 THEN;DO
CALL LogsDom(' From: 'MM.FromNode '('MM.FromName')')
CALL LogsDom(' To: 'MM.ToNode '('MM.ToName')')
END
IF MM.LogLevels>=3 THEN;DO
CALL LogsDom(' Subj: 'MM.Subj)
END
IF MM.LogLevels>=4 THEN;DO
CALL LogsDom(' Date: 'MM.Date)
END
RETURN
LogsDom:PROCEDURE EXPOSE MM.
PARSE ARG Testo
CALL WriteLog(Testo)
DO k=0 FOR MM.LogDomain.Count
IF WORD(MM.LogDomain.k,1)=UPPER(MM.FromDomain) THEN;DO
PARSE VALUE UPPER(MM.LogDomain.k) WITH DomainLog .
Testo=LogDate() '-' Testo
MM_AddToStem MM.DomainLog 'Testo'
LEAVE
END
END
RETURN
CheckEmpty:PROCEDURE EXPOSE MM.
DO l=0 FOR MM.TwitList.Count
MM.Look.0=MM.FromName
Name=STRIP(MM.TwitList.l)
MM_SearchInStem MM.Look 'Resp' Name STR
IF Resp.Count>0 THEN;DO
IF MM.Msg.Text.Count=0|MM.KillNoEmpty=TRUE THEN;DO
CALL LogsDom('--> Message Found in Twit List -> DELETED!')
IF MM.DlgUser=TRUE THEN;DO
Flags='DEL'
MM_EditMsgFlags MM.Mail MM.Message 'Flags'
END
ELSE MM_DeleteMsg MM.Mail MM.Message
RETURN TRUE
END
END
END
RETURN FALSE
StripDomain:PROCEDURE EXPOSE MM.
PARSE UPPER ARG Address '@' Domain
RETURN Domain
CheckAddress:PROCEDURE EXPOSE MM.
PARSE ARG Addr '.'
MM_GetNodelistNode Addr Info
IF RC=5 THEN;DO
CALL WriteLog('*** Error: Can`not open Traplist.library')
EXIT
END
IF Rc=4 THEN RETURN FALSE
RETURN TRUE
CheckMyAddress:PROCEDURE EXPOSE MM.
PARSE ARG Addr
MM_GetAddrs Nodi
MM_SearchInStem Nodi Resp Addr'#?' STR
IF Resp.Count>0 THEN RETURN TRUE
RETURN FALSE
NodeLists:PROCEDURE EXPOSE MM.
MM.Lista=''
End= d2c('0')
IF EXISTS(MM.Path.NodelistDir'Fidonet.index') THEN;DO
OPEN('TMP',MM.Path.NodelistDir'Fidonet.index','R')
Nodelist.Count=C2D(READCH('TMP',4))
DO k=1 FOR Nodelist.Count
Nodelist=READCH('TMP',108)
Nodelist=TRANSLATE(Nodelist," ",End)
Nodelist.k=STRIP(Nodelist,T)
MM.Lista=MM.Lista Nodelist.k','
END
MM.Lista=LEFT(MM.Lista,LENGTH(MM.Lista)-1)
CLOSE('TMP')
END
ELSE MM.Lista='The Last Nodelist'
RETURN
ProcessaMsg:PROCEDURE EXPOSE MM.
PARSE ARG Tipo
SELECT
WHEN Tipo='CROSS_NET' THEN;DO
CALL LogsDom('--> Domains are Crossed!!')
CALL MoveInBad('Domains are Crossed!!')
DO p=0 FOR MM.CrossNet.Count
CALL AddLine(Converte(MM.CrossNet.p))
END
CALL WriteText()
CALL AddVia()
CALL SaveBody()
CALL WriteMsg('NetWork are Crossed',MM.PrgName,MM.Addr,MM.FromName,MM.FromNode,'WRITE',MM.Mail)
CALL MarkSent()
RETURN
END
WHEN Tipo='UNKNOWN_NET' THEN;DO
CALL LogsDom('--> This Domain is Unknown!!')
CALL MoveInBad('This Domain is Unknown!!')
DO p=0 FOR MM.UnknownNet.Count
CALL AddLine(Converte(MM.UnknownNet.p))
END
CALL WriteText()
CALL AddVia()
CALL SaveBody()
CALL WriteMsg('This NetWork is Unknown',MM.PrgName,MM.Addr,MM.FromName,MM.FromNode,'WRITE',MM.Mail)
CALL MarkSent()
RETURN
END
WHEN Tipo='INCREDIBILE' THEN;DO
CALL LogsDom(' --> Incredible Source & Destination does not exist!!')
CALL MoveInBad('Incredible Source & Destination does not exist!!')
CALL MarkSent()
RETURN
END
WHEN Tipo='BOUNCED' THEN;DO
CALL Nodelists()
CALL LogsDom('--> Destination node is Unknown!!')
CALL MoveInBad('Destination node is Unknown!!')
DO p=0 FOR MM.Bounced.Count
CALL AddLine(Converte(MM.bounced.p))
END
CALL WriteText()
CALL AddVia()
CALL SaveBody()
CALL WriteMsg('Destination node is Unknown',MM.PrgName,MM.Addr,MM.FromName,MM.FromNode,'WRITE',MM.Mail)
CALL MarkSent()
RETURN
END
WHEN Tipo='RECEIPT_REQUEST' THEN;DO
CALL LogsDom('--> Found "Return Receipt Request"')
DO p=0 FOR MM.Receipt.Count
CALL AddLine(Converte(MM.Receipt.p))
END
CALL AddVia()
CALL SaveBody()
CALL WriteMsg('Your requested reciept',MM.Sysop,MM.Addr,MM.FromName,MM.FromNode,'WRITE',MM.Mail)
RETURN
END
WHEN Tipo='UNKNOWN_SENDER' THEN;DO
CALL Nodelists()
CALL LogsDom('--> Source node is Unknown!!')
CALL MoveInBad('Source node is Unknown!!')
DO p=0 FOR MM.UnknownSender.Count
CALL AddLine(Converte(MM.UnknownSender.p))
END
CALL WriteText()
CALL AddVia()
CALL SaveBody()
CALL WriteMsg('Source node is Unknown',MM.PrgName,MM.Addr,MM.ToName,MM.ToNode,'EDIT',MM.Mail)
RETURN
END
OTHERWISE NOP
END
RETURN
SaveBody:PROCEDURE EXPOSE MM.
MM.EndBody.Count=0
DO m=0 FOR MM.Body.Count
Testo=Converte(MM.Body.m)
MM_AddToStem MM.EndBody 'Testo'
END
MM_WriteStem 'T:MM.Body.Tmp' MM.EndBody
MM.Body.Count=0
RETURN
AddVia:PROCEDURE EXPOSE MM.
CALL AddLine('')
CALL AddLine('-+-' MM.PrgName '-' MM.Copyright)
CALL AddLine('')
CALL AddLine('1'X||'Via Node' MM.Addr' 'MM.RecDate' 'TIME()' ('MM.PrgName')')
RETURN
AddLine:PROCEDURE EXPOSE MM.
PARSE ARG Line
Cont=MM.Body.Count
MM.Body.Cont=Line
MM.Body.Count=Cont+1
RETURN
CheckExclude:PROCEDURE EXPOSE MM.
PARSE ARG Name,Address
MM.Look.0=TRANSLATE(Name,"_"," ")
DO i=0 FOR MM.ExcludeName.Count
MM_SearchInStem MM.Look Resp MM.ExcludeName.i STR
IF Resp.Count>0 THEN;DO
CALL LogsDom('The sender of the message is found in Exclude List -> Skipped! ')
RETURN 'TRUE'
END
END
MM.Look.0=Address
DO i=0 FOR MM.ExcludeNode.Count
MM_SearchInStem MM.Look Resp MM.ExcludeNode.i STR
IF Resp.Count>0 THEN;DO
CALL LogsDom('The sender of the message is found in Exclude List -> Skipped! ')
RETURN 'TRUE'
END
END
RETURN 'FALSE'
CheckPGP:PROCEDURE EXPOSE MM.
PARSE ARG MM.Look.0
DO i=0 FOR MM.CheckPGP.Count
MM_SearchInStem MM.Look Resp MM.CheckPGP.i STR
IF Resp.Count>0 THEN;DO
CALL LogsDom('The Sender Of The Message is Found in CheckPGP List -> Checking! ')
IF MM.CheckPGPMsg=TRUE THEN;DO
IF FoundPGP('"#?BEGIN PGP MESSAGE#?"')=TRUE THEN RETURN TRUE
END
IF MM.CheckPGPTxt=TRUE THEN;DO
IF FoundPGP('"#?BEGIN PGP TEXT#?"')=TRUE THEN RETURN TRUE
END
IF MM.CheckPGPKey=TRUE THEN;DO
IF FoundPGP('"#?BEGIN PGP PUBLIC KEY BLOCK#?"')=TRUE THEN RETURN TRUE
END
END
END
RETURN FALSE
FoundPGP:PROCEDURE EXPOSE MM.
PARSE ARG TextPGP
MM_SearchInStem MM.Msg.Text Resp TextPGP STR
IF Resp.Count>0 THEN;DO
CALL LogsDom(' --> Detected PGP Message')
DO p=0 FOR MM.PGPMessage.Count
CALL AddLine(Converte(MM.PGPMessage.p))
END
CALL AddVia()
CALL SaveBody()
CALL WriteMsg('Detected PGP Message',MM.PrgName,MM.Addr,MM.FromName,MM.FromNode,'WRITE',MM.Mail)
CALL MarkSent()
RETURN TRUE
END
RETURN FALSE
MarkSent:PROCEDURE EXPOSE MM.
IF MM.DlgUser=TRUE THEN;DO
NewValue='SENT DEL'
MM_EditMsgFlags MM.Mail MM.Message 'NewValue'
MM_ReadMsg MM.Mail MM.Message Messaggio
IF INDEX(Messaggio.Flags,'SENT')=0 THEN;DO
CALL LogsDom('** ERROR!! Sending Message to Paolo Carotenuto')
END
END
ELSE MM_DeleteMsg MM.Mail MM.Message
RETURN
ReMapName:PROCEDURE EXPOSE MM.
PARSE ARG Name,Address
DO i=0 FOR MM.ReMapName.Count
PARSE VAR MM.ReMapName.i Nome Akas
IF UPPER(TRANSLATE(STRIP(Name),"_"," "))=UPPER(STRIP(Nome)) THEN;DO
DO WHILE Akas ~=''
PARSE VAR Akas Aka Akas
IF STRIP(StripDomain(Address))=STRIP(StripDomain(Aka)) THEN;DO
IF Address ~=Aka THEN;DO
Mess.ToAddr=Aka
MM.ToNode=Aka
MM_EditMsg MM.Mail MM.Message Mess
CALL LogsDom('--> ReMapping Message For:' Name 'To' Aka)
END
RETURN
END
END
END
END
RETURN
CheckBad:PROCEDURE EXPOSE MM.
PARSE ARG FromAddr,ToAddr,FromName,ToName
MM.Look.0=FromAddr
DO i=0 FOR MM.BadFromAddr.Count
PARSE VAR MM.BadFromAddr.i BadFromNodo Mode
BadFromNodo=STRIP(BadFromNodo)
MM_SearchInStem MM.Look Resp BadFromNodo STR
IF Resp.Count>0 THEN;DO
CALL LogsDom('The Sender of the message is found in Bad List...')
IF STRIP(Mode)='REPLY' THEN;DO
DO p=0 FOR MM.BadMessage.Count
CALL AddLine(Converte(MM.BadMessage.p))
END
CALL WriteText()
CALL AddVia()
CALL SaveBody()
CALL WriteMsg('Bad Message',MM.PrgName,MM.Addr,MM.FromName,MM.FromNode,'WRITE',MM.Mail)
CALL MarkSent()
END
ELSE;DO
CALL MarkSent()
CALL MoveInBad('The Sender of the message is found in Bad List')
END
RETURN 'TRUE'
END
END
MM.Look.0=FromTo
DO i=0 FOR MM.BadToAddr.Count
PARSE VAR MM.BadToAddr.i BadToNodo Mode
BadToNodo=STRIP(BadToNodo)
MM_SearchInStem MM.Look Resp BadToNodo STR
IF Resp.Count>0 THEN;DO
CALL LogsDom('The Destination of the message is found in Bad List...')
IF STRIP(Mode)='REPLY' THEN;DO
DO p=0 FOR MM.BadMessage.Count
CALL AddLine(Converte(MM.BadMessage.p))
END
CALL WriteText()
CALL AddVia()
CALL SaveBody()
CALL WriteMsg('Bad Message',MM.PrgName,MM.Addr,MM.FromName,MM.FromNode,'WRITE',MM.Mail)
CALL MarkSent()
END
ELSE;DO
CALL MarkSent()
CALL MoveInBad('The Destination of the message is found in Bad List')
END
RETURN 'TRUE'
END
END
MM.Look.0=TRANSLATE(FromName,"_"," ")
DO i=0 FOR MM.BadFrom.Count
PARSE VAR MM.BadFrom.i BadFromName Mode
BadFromName=STRIP(BadFromName)
MM_SearchInStem MM.Look Resp BadFromName STR
IF Resp.Count>0 THEN;DO
CALL LogsDom('The Sender of the message is found in Bad List....')
IF STRIP(Mode)='REPLY' THEN;DO
DO p=0 FOR MM.BadMessage.Count
CALL AddLine(Converte(MM.BadMessage.p))
END
CALL WriteText()
CALL AddVia()
CALL SaveBody()
CALL WriteMsg('Bad Message',MM.PrgName,MM.Addr,MM.FromName,MM.FromNode,'WRITE',MM.Mail)
CALL MarkSent()
END
ELSE;DO
CALL MarkSent()
CALL MoveInBad('The Sender of the message is found in Bad List')
END
RETURN 'TRUE'
END
END
MM.Look.0=TRANSLATE(ToName,"_"," ")
DO i=0 FOR MM.BadTo.Count
PARSE VAR MM.BadTo.i BadToName Mode
BadToName=STRIP(BadToName)
MM_SearchInStem MM.Look Resp BadToName STR
IF Resp.Count>0 THEN;DO
CALL LogsDom('The Destination of the message is found in Bad List...')
IF STRIP(Mode)='REPLY' THEN;DO
DO p=0 FOR MM.BadMessage.Count
CALL AddLine(Converte(MM.BadMessage.p))
END
CALL WriteText()
CALL AddVia()
CALL SaveBody()
CALL WriteMsg('Bad Message',MM.PrgName,MM.Addr,MM.FromName,MM.FromNode,'WRITE',MM.Mail)
CALL MarkSent()
END
ELSE;DO
CALL MarkSent()
CALL MoveInBad('The Destination of the message is found in Bad List')
END
RETURN 'TRUE'
END
END
RETURN 'FALSE'
MoveInBad:PROCEDURE EXPOSE MM.
PARSE ARG MM.Status
DO u=0 FOR MM.Msg.Head.Count
PARSE UPPER VAR MM.Msg.Head.u Kludge .
IF Kludge='' THEN ITERATE
SELECT
WHEN INDEX(Kludge,'DOMAIN') ~=0 THEN ITERATE
WHEN INDEX(Kludge,'INTL') ~=0 THEN ITERATE
WHEN INDEX(Kludge,'FMPT') ~=0 THEN ITERATE
WHEN INDEX(Kludge,'TOPT') ~=0 THEN ITERATE
WHEN INDEX(Kludge,'MSGID:') ~=0 THEN ITERATE
WHEN INDEX(Kludge,'REPLY:') ~=0 THEN ITERATE
OTHERWISE CALL AddLine(MM.Msg.Head.u)
END
END
CALL AddLine('================================================================================')
CALL AddLine('From Area: 'MM.Mail)
CALL AddLine(' Status: 'MM.Status)
CALL AddLine('================================================================================')
CALL AddLine('')
DO p=0 FOR MM.Msg.Text.Count
CALL AddLine(MM.Msg.Text.p)
END
DO p=0 FOR MM.Msg.Foot.Count
CALL AddLine(MM.Msg.Foot.p)
END
CALL SaveBody()
Move.Subj=MM.Subj
Move.From=MM.FromName
Move.FromAddr=MM.FromNode
Move.To=MM.ToName
Move.ToAddr=MM.ToNode
Move.Flags=MM.Msg.Flags||'HOLD SENT'
Move.File='T:MM.Body.Tmp'
MM_WriteMsg MM.AreaBad Move
CALL WriteLog(' Moving Message to ['MM.AreaBad']')
RETURN
WriteText:PROCEDURE EXPOSE MM.
DO p=0 FOR MM.Msg.Head.Count
CALL AddLine('-> 'TRANSLATE(MM.Msg.Head.p,"^","1"x))
END
DO p=0 FOR MM.Msg.Text.Count
CALL AddLine('->' MM.Msg.Text.p)
END
DO p=0 FOR MM.Msg.Foot.Count
CALL AddLine('-> 'TRANSLATE(MM.Msg.Foot.p,"^","1"x))
END
RETURN
ReadConfig:PROCEDURE EXPOSE MM.
MM.TwitList.Count=0
MM.ExcludeName.Count=0
MM.ExcludeNode.Count=0
MM.CrossNet.Count=0
MM.UnknownNet.Count=0
MM.Bounced.Count=0
MM.UnknownSender.Count=0
MM.Receipt.Count=0
MM.PGPMessage.Count=0
MM.BadMessage.Count=0
MM.Domain.Count=0
MM.Remap.Count=0
MM.RemapName.Count=0
MM.BadTo.Count=0
MM.BadFrom.Count=0
MM.BadToAddr.Count=0
MM.BadFromAddr.Count=0
MM.Look.Count=1
MM.Log.Count=0
MM.LogDomain.Count=0
MM.CheckPGP.Count=0
MM.LogLevels=3
MM.AreaBad=''
MM.LogFile=''
MM.WriteLog=FALSE
MM.DlgUser=FALSE
MM.KillNoEmpty=FALSE
MM.CheckPGPMsg=TRUE
MM.CheckPGPTxt=TRUE
MM.CheckPGPKey=TRUE
MM_ReadStem MM.PathCfg||'MM_MsgTrack.Cfg' Config
IF Rc ~=0 THEN;DO
CALL WriteLog('*** Error: Can not open config "'MM.PathCfg'MM_MsgTrack.cfg"')
EXIT 10
END
DO l=0 FOR Config.Count
IF (LEFT(Config.l,1) ~=';')&Config.l ~='' THEN;DO
PARSE VAR Config.l Keyword Dato
SELECT
WHEN UPPER(Keyword)='#EXCLUDENAME' THEN;DO
Dato=TRANSLATE(STRIP(Dato),"_"," ")
MM_AddToStem MM.ExcludeName 'Dato'
END
WHEN UPPER(Keyword)='#EXCLUDENODE' THEN;DO
Dato=STRIP(Dato)
MM_AddToStem MM.ExcludeNode 'Dato'
END
WHEN UPPER(Keyword)='#LOGDOMAIN' THEN;DO
PARSE VALUE UPPER(Dato) WITH Domains .
MM.Domains.Count=0
Dato=UPPER(STRIP(Dato))
MM_AddToStem MM.LogDomain 'Dato'
END
WHEN UPPER(Keyword)='#CHECKPGPMSG' THEN;DO
IF INDEX(UPPER(Dato),'OFF') ~=0 THEN MM.CheckPGPMsg=FALSE
END
WHEN UPPER(Keyword)='#CHECKPGPTXT' THEN;DO
IF INDEX(UPPER(Dato),'OFF') ~=0 THEN MM.CheckPGPTxt=FALSE
END
WHEN UPPER(Keyword)='#CHECKPGPKEY' THEN;DO
IF INDEX(UPPER(Dato),'OFF') ~=0 THEN MM.CheckPGPKey=FALSE
END
WHEN UPPER(Keyword)='#LOGFILE' THEN MM.LogFile=STRIP(Dato)
WHEN UPPER(Keyword)='#LOGLEVEL' THEN MM.LogLevels=STRIP(Dato)
WHEN UPPER(Keyword)='#BADAREA' THEN MM.AreaBad=STRIP(Dato)
WHEN UPPER(Keyword)='#WRITEIMMEDIATE' THEN MM.WriteLog=TRUE
WHEN UPPER(Keyword)='#DLG' THEN MM.DlgUser=TRUE
WHEN UPPER(Keyword)='#KILLNOEMPTY' THEN MM.KillNoEmpty=TRUE
WHEN UPPER(Keyword)='#REMAPADDR' THEN MM_AddToStem MM.Remap 'Dato'
WHEN UPPER(Keyword)='#REMAPNAME' THEN MM_AddToStem MM.RemapName 'Dato'
WHEN UPPER(Keyword)='#TWITNAME' THEN MM_AddToStem MM.TwitList 'Dato'
WHEN UPPER(Keyword)='#CROSS_NET' THEN MM_AddToStem MM.CrossNet 'Dato'
WHEN UPPER(Keyword)='#UNKNOWN_NET' THEN MM_AddToStem MM.UnknownNet 'Dato'
WHEN UPPER(Keyword)='#BOUNCED' THEN MM_AddToStem MM.Bounced 'Dato'
WHEN UPPER(Keyword)='#UNKNOWN_SENDER' THEN MM_AddToStem MM.UnknownSender 'Dato'
WHEN UPPER(Keyword)='#RECEIPT' THEN MM_AddToStem MM.Receipt 'Dato'
WHEN UPPER(Keyword)='#PGP_MESSAGE' THEN MM_AddToStem MM.PGPMessage 'Dato'
WHEN UPPER(Keyword)='#BAD_REPLY' THEN MM_AddToStem MM.BadMessage 'Dato'
WHEN UPPER(Keyword)='#CHECKPGPNODE' THEN MM_AddToStem MM.CheckPGP 'Dato'
WHEN UPPER(Keyword)='#BADTO' THEN MM_AddToStem MM.BadTo 'Dato'
WHEN UPPER(Keyword)='#BADFROM' THEN MM_AddToStem MM.BadFrom 'Dato'
WHEN UPPER(Keyword)='#BADFROMADDR' THEN MM_AddToStem MM.BadFromAddr 'Dato'
WHEN UPPER(Keyword)='#BADTOADDR' THEN MM_AddToStem MM.BadToAddr 'Dato'
OTHERWISE
END
END
END
MM_GetCfgPaths MM.Path
MM_GetAddrs Address
DO i=0 FOR Address.Count
PARSE UPPER VAR Address.i '@' Network
MM_SearchInStem MM.Domain Resp Network STR
IF Resp.Count=0 THEN;DO
MM_AddToStem MM.Domain 'Network'
END
END
MM_GetAreas MM.Mails MAIL
IF MM.Mails.Count>1 THEN;DO
Cont=0
DO b=0 FOR MM.Mails.Count
MM_GetAreaInfo MM.Mails.b Info
PARSE UPPER VAR Info.Addr '@' Domain
IF Domain='VIRTUAL' THEN ITERATE
MM.Mails.Cont=MM.Mails.b
Cont=Cont+1
END
MM.Mails.Count=Cont
END
MM_GetSysop 'MM.Sysop'
PARSE VALUE DATE() WITH Day Month Year .
MM.RecDate= Day Month RIGHT(Year,2)
RETURN
Init:PROCEDURE EXPOSE MM.
MM.Body.Count=0
MM.FromNode=MM.Msg.FromAddr
MM.FromName=MM.Msg.From
MM.FromDomain=StripDomain(MM.Msg.FromAddr)
MM.FromFirst=WORD(MM.Msg.From,1)
MM.ToNode=MM.Msg.ToAddr
MM.ToName=MM.Msg.To
MM.ToDomain=StripDomain(MM.Msg.ToAddr)
MM.Subj=MM.Msg.Subj
MM.Date=MM.Msg.Date
MM_GetNearestAddr MM.FromNode 'MM.Addr'
CALL WriteStatus(MM.Message)
RETURN
WriteMsg:PROCEDURE EXPOSE MM.
PARSE ARG Reply_Subj,Reply_From,Reply_FromAddr,Reply_To,Reply_ToAddr,Reply_Mode,Reply_Area
Reply.Subj=Reply_Subj
Reply.From=Reply_From
Reply.FromAddr=Reply_FromAddr
Reply.To=Reply_To
Reply.ToAddr=Reply_ToAddr
Reply.Flags='PVT'
Reply.File='T:MM.Body.Tmp'
IF Reply_Mode='WRITE' THEN MM_WriteMsg Reply_Area Reply
ELSE;DO
Reply.Flags='!CRASH PVT'
MM_EditMsg Reply_Area MM.Message Reply
END
RETURN
Converte:PROCEDURE EXPOSE MM.
PARSE ARG Data
IF INDEX(Data,'%')=0 THEN RETURN Data
Data=Replace(Data,MM.FromNode,'%FROM_NODE')
Data=Replace(Data,MM.FromDomain,'%FROM_DOMAIN')
Data=Replace(Data,MM.FromName,'%FROM_NAME')
Data=Replace(Data,MM.FromFirst,'%FROM_FIRST')
Data=Replace(Data,MM.ToNode,'%TO_NODE')
Data=Replace(Data,MM.ToDomain,'%TO_DOMAIN')
Data=Replace(Data,MM.ToName,'%TO_NAME')
Data=Replace(Data,MM.Subj,'%SUBJ')
Data=Replace(Data,MM.Date,'%MSG_DATE')
Data=Replace(Data,MM.RecDate,'%REC_DATE')
Data=Replace(Data,MM.Lista,'%LIST')
Data=Replace(Data,MM.Sysop,'%SYSOP')
Data=Replace(Data,MM.Addr,'%NODO')
RETURN Data
LOGDATE:PROCEDURE
Tempo='* 'LEFT(DATE(),LENGTH(DATE())-4)||RIGHT(DATE(),2)' 'TIME()
RETURN Tempo
Replace:PROCEDURE
PARSE ARG Data,New,Old
DO WHILE INDEX(Data,Old) ~=0
INTERPRET "PARSE VAR Data l '"Old"' r"
Data=l||New||r
END
RETURN Data
ReMap:PROCEDURE EXPOSE MM.
PARSE ARG Nodo
DO y=0 FOR MM.Remap.Count
PARSE VAR MM.Remap.y FromNodo ToNodo
IF UPPER(STRIP(FromNodo))=UPPER(Nodo) THEN;DO
ToNodo=STRIP(ToNodo)
CALL LogsDom('Remapping Message from: 'Nodo' to: 'ToNodo)
Mgs.ToAddr=ToNodo
MM.ToNode=ToNodo
MM_EditMsg MM.Mail MM.Message Mgs
RETURN
END
END
RETURN
WriteLog:PROCEDURE EXPOSE MM.
PARSE ARG Testo
MM_WriteLog 'Testo' MM.LogLevel
IF MM.LogFile ~='' THEN;DO
Testo=LogDate() '-' Testo
MM_AddToStem MM.Log 'Testo'
END
RETURN